40. 组合总和 II

40. 组合总和 II

Similar Question

这里的跳过重复和 18. 四数之和, 15. 三数之和 的思路一致

要对结果去重很困难, 那就进行剪枝来做到去重

Solution Tips

方案一: 回溯 + 跳过重复 + 剪枝

var combinationSum2 = function (candidates, target) {
    const res = [];
    const cur = [];
    let curSum = 0;
    // 数字自身就是有重复的, 数组本身不能去重, 但是却要对最后的结果进行去重
    candidates.sort((a, b) => a - b);

    function backTracking(curIndex) {
        if (curSum === target) {
            res.push([...cur])
            return;
        }

		if (curSum > target) {
			return;
		}

        // 剪枝, 可以考虑升序排序然后剪枝
        for (let i = curIndex; i < candidates.length; i++) {
            cur.push(candidates[i]);
            curSum += candidates[i];

            backTracking(i + 1);
            // 回溯操作
            cur.pop();
            curSum -= candidates[i];
            // 在这里去重, index 要从一个新的数字开始 这个去重操作, 似成相识
			// 完美的做到了同层级去重, 却不影响 dfs 获取相同的 num, 其他人还是没有融会贯通呀
            while (candidates[i] === candidates[i + 1]) i++;
        }
    }

    backTracking(0);
    return res;
};
let candidates = [2, 3, 6, 7], target = 7
console.log(combinationSum2(candidates, target));